<?php

namespace app\model;

use think\Model;
use think\model\concern\SoftDelete;

class User extends Model
{
    // 表名
    protected $name = 'users';

    // 自动时间戳
    protected $autoWriteTimestamp = true;

    // 定义时间戳字段名
    protected $createTime = 'created_at';
    protected $updateTime = 'updated_at';

    // 字段类型转换
    protected $type = [
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
        'last_login_at' => 'datetime',
    ];

    // 隐藏字段
    protected $hidden = ['password'];

    // 关联第三方授权
    public function oauths()
    {
        return $this->hasMany(UserOauth::class);
    }

    // 关联设备
    public function devices()
    {
        return $this->hasMany(UserDevice::class);
    }

    // 关联分类
    public function categories()
    {
        return $this->hasMany(Category::class);
    }

    // 关联账号
    public function accounts()
    {
        return $this->hasMany(Account::class);
    }

    // 关联日志
    public function logs()
    {
        return $this->hasMany(UserLog::class);
    }

    // 密码修改器
    public function setPasswordAttr($value)
    {
        return password_hash($value, PASSWORD_DEFAULT);
    }

    // 验证密码
    public function checkPassword($password)
    {
        return password_verify($password, $this->password);
    }

    // 主密码修改器
    public function setMasterPasswordHashAttr($value)
    {
        return password_hash($value, PASSWORD_DEFAULT);
    }

    // 验证主密码
    public function checkMasterPassword($masterPassword)
    {
        if (empty($this->master_password_hash)) {
            // 如果没有设置主密码，使用登录密码作为主密码
            return $this->checkPassword($masterPassword);
        }
        return password_verify($masterPassword, $this->master_password_hash);
    }

    // 哈希主密码
    public function hashMasterPassword($masterPassword)
    {
        return password_hash($masterPassword, PASSWORD_DEFAULT);
    }

    // 通过用户名/手机号/邮箱查找用户
    public static function findByLogin($login)
    {
        return self::where('username', $login)
            ->whereOr('phone', $login)
            ->whereOr('email', $login)
            ->find();
    }

    // 检查登录凭据是否存在
    public static function checkLoginExists($login, $excludeId = null)
    {
        $query = self::where(function ($query) use ($login) {
            $query->where('username', $login)
                ->whereOr('phone', $login)
                ->whereOr('email', $login);
        });

        if ($excludeId) {
            $query->where('id', '<>', $excludeId);
        }

        return $query->find();
    }

    // 更新最后登录时间
    public function updateLastLogin()
    {
        $this->last_login_at = date('Y-m-d H:i:s');
        return $this->save();
    }

    // 获取用户统计信息
    public function getStats()
    {
        return [
            'account_count' => $this->accounts()->count(),
            'category_count' => $this->categories()->count(),
            'device_count' => $this->devices()->count(),
            'last_login' => $this->last_login_at,
        ];
    }
}